package com.we.risk.smsInfo.utils;

import com.we.utils.CommonTimeTools;
import com.we.utils.RegexTools;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.common.type.HiveDecimal;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;

public class smsInfoTools {
    public static final Double DECIMAL102LIMIT = 99999999.99;
    public static final String bodyNameRegex =
            "((?<=^\\[)([^提醒|提示|流量|话费|权益]{1,8})(?=\\]))|((?<=\\[)([^提醒|提示|流量|话费|权益]{1,8})(?=\\]$))|((?<=^【)([^提醒|提示|流量|话费|权益]{1,8})(?=】))|((?<=【)([^提醒|提示|流量|话费|权益]{1,8})(?=】$))";
    public static final String teleComRegex =
            "[\\u4e00-\\u9fa5]{1,3}移动|[\\u4e00-\\u9fa5]{1,3}联通|[\\u4e00-\\u9fa5]{1,3}电信|全球通|10086|和校园|天翼|语音不足预警|停机预警|C网秘书|和娱乐|江西和校园|联通特惠|联通小沃|沃运维|电信会员日|账单查询|移动认证账单|联通秘书|联通手机管家|12582|和风雨|和包|短信账单|信用停机保障|短信分期|可用额度预警";
    public static final String expressRegex =
            "菜鸟驿站|快递|中国邮政|妈妈驿站|丰巢|包裹侠|韵达超市|菜鸟裹裹|货拉拉|快宝驿站|来取|菜鸟乡村|顺丰速运|圆通|闪送|顺丰同城急送|速递易|菜鸟|熊猫快收|滴滴货运|达达平台|驿收发|菜鸟智能柜|极兔速递|中通快运|UU跑腿|顺心捷达|运满满|和驿|小兵驿站|跨越速运|物流|壹米滴答|达达快送|韵达|申通|喵站|菜鸟网络|蜂鸟配送|货拉拉搬家|百世快运|韵达快运|日日顺|心甜智能柜|丰巢服务站|点易达|蜜罐|广州邮政|顺丰|取件码|联运通平台|邮你好看|递易智能|近邻宝|货拉拉企业版|邮政|格格小区|扁担圈|职场邮话|丹鸟|邻里驿站|中 邮|中通|智能柜|点我达|邮政EMS|天地华宇|中邮驿站|广东邮政|德邦|邮个茶水间|圆通|邮证|联昊通速递|韵达速递|中邮|加运美速递|365跑腿网|邮政|满帮|贰仟家";
    public static final String serviceRegex =
            "出行|快车|顺风车|打车|滴滴代驾|橙心优选|12306|东方航空|青桔骑行|智行|首汽约车|哈啰|飞猪|滴滴拼车|青菜拼车|e代驾|专车|春秋航空|华住会|同程旅游|高德|滴滴青桔|厦航|快的新出租|滴滴加油|高铁管家|深圳航空|万顺叫车|滴滴单车平台|铁友网|小桔有车|帮邦行|滴滴企业|摩拜单车|巴士管家|海南航空|山东航空|四川航空|智游宝|滴滴出租车|滴滴远途拼车|吉祥航空|新桔代驾|榛果民宿|e高速|航天信息|途牛旅游网|安徽ETC|姚司机代驾|东呈会|航班管家|UBER优步|街兔电单车|飞猪门票|航旅纵横|驴妈妈|华夏航空|飞猪汽车票|安代驾|滴滴月付|聚的出租|妥妥E行|微代驾|高速ETC|滴滴优享|滴滴司机|小猪|京东|拼多多|唯品会|小店|淘宝|苏宁|闲鱼|淘会员|阿里巴巴|天猫医药馆|淘宝网|抖音电商|得物App|盒马|华为商城|新橙优品|天猫|阿里健康|品牌特卖|购机网|快手电商|叮咚买菜|阿里拍卖|当当|手机淘宝|微店|兑换商城|快手小店|苏宁易购|天猫超市|天猫健康|网易严选|1688|尚尚商城|宜家俱乐部|京 东|阿里巴巴集团|农村淘宝|金牛电商|贝店|爱奢|淘宝特价版|京喜拼拼|全民严选|PDD|亚马逊|尚尚严选|聚美优品|严选超值兑|淘宝淘鲜达|淘红利|米哆优品|618狂欢节|淘福利|花西子旗舰店|天猫超市卡|考拉海购|奢品汇|优品旗舰店|苏 宁|天天购|淘品精选|酒便利|淘达人|欢太商城|淘宝调研|玖富商城|善融商务|hn商城|网易考拉|云或物电商|达令家|HFP天猫店|商家通知|淘特卖|淘特App|毒App|淘优惠|淘品福利社|每日一淘|618大促|优选商城|淘宝专访|洋码头|美团|咪咕阅读|美团点评|饿了么|携程|探探应用|去哪儿网|同程旅行|58同城|美团网|美团优选|同程艺龙|三农通|美团跑腿|智联招聘|美团民宿|大众点评|BOSS直聘|鱼泡网|美团买菜|美团单车|前程无忧|美团电单车|淘票票|美团配送|美团互助|外卖|日日顺乐家|万师傅家庭版|猫眼演出|摩西管家|美团闪购|猎聘|赶集直招|鲁班到家|蓝店|店长直聘|鱼泡网app|齐家网|美团联名卡|口碑|环球黑卡|58到家|天鹅到家|微生活|酷家乐|直播招聘|智慧家庭";
    public static final String payToolRegex =
            "翼支付|京东支付|支付通|微信支付|宝付支付|通联支付|美团支付|瑞银信|易宝支付|通易付|中金支付|收钱吧|新浪支付|连连支付|支 付 宝|汇来米|财付通|杉德支付|云闪付|随行付|乐刷|乐刷科技|海科融通|星驿付|汇付天下|乐刷支付|银豹|瑞鑫支付|闪电宝|美管加|现代支付|喔刷|中付支付|银惠通|星支付|立刷|支付随心|付临门|合利宝|新中付|刷宝|嘉联支付|支付无忧|刷新支付";

    public static final String bankBodyNameRegex =
            "银行|农信|农行|中行|工行|农商行|银联|安徽农金|信合|农商|农发行|邮储|工银信使|汇丰中国|雅安商行|邮 储";
    public static final String bankBodyRegex = "[^了解]信用卡|广发卡";
    public static final String creditBodyNameRegex = "信用卡|联名卡|掌上生活|光大联名卡";
    public static final String creditBodyNameRegex2 =
            "银行|农信|农行|中行|工行|农商行|银联|安徽农金|信合|农商|农发行|邮储|工银信使|汇丰中国|雅安商行";
    public static final String creditBodyRegex = "[^了解]信用卡|广发卡";

    public static final String cashOutRegex =
            "转出|交易人民币-|支付人民币|支出|支付|转帐付|向.*?付款|向.*?账户转账|取出|发生一笔消费|余额发生变动\\(-|支取|付款|取人民币|跨行汇款|给.*?账户转账|行内转账交易|跨行转账交易|账户快捷金额|账户消费金额|账户微信转账金额|手机银行跨行转账|账户微信红包金额|向.*?汇款|户银行转证券金额|账户代扣金额|账户消费金额|银联扣款人民币|实时转至他行人民币|向财付通完成财付通交易人民币|完成转支交易人民币|交易人民币-|取款|成功付款人民币|跨行转账|邮消金额|完成代付交易人民币|完成财付通交易人民币|账户扣款金额";
    public static final String cashInRegex =
            "转入|收入|转账收|存入|存款|提现|入账|收到汇款人民币|完成转存交易|向您尾号.*?账户完成网银转账|代发|冲正|到账|向您尾号.*?账户他行来账金额|工资|完成现存交易人民币|完成往来交易人民币|汇兑来账";
    public static final String loanRepayRegex =
            "本期账单|应还本金|应还利息|归还贷款利息|已还利息|已还本金|还本息|贷款还款人民币|个贷还款|归还贷款本息|已还款成功|还款人民币|归还本息|贷款归还.*?发生额=|还款.*?元|须还款|还贷金额|完成正常还款交易|还本息人民币|月账单|需还金额|发生贷款还款提醒|贷款将于.*?还款|归还贷款本息|成功扣款.*?用于偿还";

    /** Amount Regex */
    public static final String bankRemainAmtRegex = "(?<=余额.{0,5}|余)(\\d+\\.?\\d*)";

    public static final String cashOutAmtRegex =
            "(?<=转出.{0,6}|交易人民币-.{0,6}|支付人民币.{0,6}|支出.{0,6}|支付.{0,6}|转帐付.{0,6}|向.{0,6}付款.{0,6}|向.{0,6}账户转账.{0,6}|取出.{0,6}|发生一笔消费.{0,6}|余额发生变动\\(-.{0,6}|支取.{0,6}|付款.{0,6}|取人民币.{0,6}|跨行汇款.{0,6}|给.{0,8}账户转账.{0,6}|行内转账交易.{0,6}|跨行转账交易.{0,6}|账户快捷金额.{0,6}|账户消费金额.{0,6}|账户微信转账金额.{0,6}|手机银行跨行转账.{0,6}|账户微信红包金额.{0,6}|向.{0,8}汇款.{0,6}|户银行转证券金额.{0,6}|账户代扣金额.{0,6}|账户消费金额.{0,6}|银联扣款人民币.{0,6}|实时转至他行人民币.{0,6}|向财付通完成财付通交易人民币.{0,6}|完成转支交易人民币.{0,6}|交易人民币-.{0,6}|取款.{0,6}|成功付款人民币.{0,6}|跨行转账.{0,6}|邮消金额.{0,6}|完成代付交易人民币.{0,6}|完成财付通交易人民币.{0,6}|账户扣款金额.{0,6})(\\d+\\.?\\d{0,3})";
    public static final String cashInAmtRegex =
            "(?<=转入.{0,6}|收入.{0,6}|转账收.{0,6}|存入.{0,6}|存款.{0,6}|提现.{0,6}|入账.{0,6}|收到汇款人民币.{0,6}|完成转存交易.{0,6}|向您尾号.{0,8}账户完成网银转账.{0,6}|代发.{0,6}|冲正.{0,6}|到账.{0,6}|向您尾号.{0,8}账户他行来账金额.{0,6}|工资.{0,6}|完成现存交易人民币.{0,6}|完成往来交易人民币.{0,6})(\\d+\\.?\\d{0,3})";

    public static final String crdtAmtRegex = "(?<=可用额度.{0,6}|可用余额.{0,6})(\\d+\\.?\\d{0,3})";
    public static final String crdtCosuRegex = "(?<=消费.{0,6}|取现.{0,6})(\\d+\\.?\\d{0,3})";

    public static final String itntLendBodyNameRegex =
            "柚理财|永利宝|豆豆花|贝多多|中腾信ios版|信而富|借呗|天马金融|先花花|神灯理财|莫愁花极速版|瑞信富盈|国美美易车|闪学金库|闪银科技|钱站爱钱进|度小滿|呼哈商户端|重信金融|安徽木业家具网|u族|多玺云|借了呗|中和宝|新心金融|卡卡银行|闪电周转|卡农论坛|普益投|商户通理财|钱趣理财|91征信管家|OPPO钱包|机速购|芝麻小钱|久金所|优投在线|永兴易投|q车网|民生电商|极速借|现金小巴士|安金袋|闪 垠|蚂蚁金服|用钱无忧|现金巴士|花乐|滴滴金融|蚂蚁花钱|品值|悦农行|随借|秒借宝|中金恒信|小米金融|笑脸提钱|51找钱|现金快车|p2p理财|低息攻略|前海理想金融|闪讯财富|聚众金融|宜发财富|好有钱|万达万能cash|融金云|钱方位|现金盒子|你我借款|掌上钱庄|任我花|信鸿财富|久融金融|医械好融通|有信|甩单宝|飞鸿商城|资金宝|现金侠|来钱快|好利网理财|随意花|易鑫|易钱庄|宜信|诺诺镑客|随我花|yes金融|51即刻有|美团月付|小赢客服|借吗攻略|借你花|金融管家100|融权投资|点牛金融|缺钱么极速版|u+优财|一房金融|玖 富|中腾信金融|宜融天下|桔多多|帮帮助学|秒下款|杭银消费|招集令|前金服|指尖小花|惠借管家|喔喔金|现金速借|徣 呗|钱宝贝|快批|校米|买单侠|什马金融商户版|有信钱包|借么|全联征信|爱创人|甄好借|华为钱包|菠萝袋|拍财富|万享金融|领现金红包|先花钱|小信用|哈勃车服务|预约借款|惠借|安逸花|格米校园经理|徵笠貨|蚂蚁借呗|美团团好货|一元网|银通金融|学票|现金宝|阿里小钱|有钱嗨|穗金所|东方金钰|蚂蚁集团|卡神信用卡|学生态校花|问融|现金超人|爱用钱管家|掌众金融|交易星|人人信|中网国投|千百块|小好用钱经理版|财行家|泰达在线|人从资本|微享加|平安橙子|从容网|蜻蜓白卡|闪电助学|星宝支付|炒股达人|普邦金控|跃老板|大数金融|乐融|网联金融|任意花|国美美易分|矀岦货|玖享借|河南央联金融|51酷卡|车聚宝|财员外|前金所理财|萌萌美管家|临时借|金蛛|新合作金融|万达线上|刷脸呗|猎马信用卡管家|小企额|淘钱罐|翼支付|赊宝|开始|备用金|榕树货款|口袋快借|芒哩|信用飞|闪电还|柠檬销售|宝象金融|睿银盛嘉|摇财树|一刻千金|百朋金融|佰易理财|人人清|爱财网|小鱼bank|用钱宝|超拾惠商户端|玖富万卡|靠谱鸟|蚂蚁[^保]|安心花|和玺数据|cashnice|易借金|先锋宝|鑫享通|方维p2p|草根金融|臻有钱|守财奴|金宝融|盈额宝|房互网|金无忧理财|京东金融认证|易快借|省点花|赢火虫|果儿金融|兑啦|轻松提额|惠小融|蚂蚁借贝|钱师爷|阿拉丁校园|信用公社|狮桥在线|融信壹百|捷信|乐花花|u族花无缺|校米企业|向右转|tcl金融|汇聚财|金介所|付壹代|尚资本|交单宝|来钱宝|深圳融资|宜享花|职钱|省呗|轻松有钱|好用钱|拿去花|维金荟|新信钱包|月光蓝卡|乾包|人人聚财|星星钱袋|米老板|恒生活|钱太太|国美在线|任性付|极速借攻略|丰田金融|云狐金融|恰拍信用卡|.*?借呗.*?|有利网理财|融e享|金联储|再金所|小意思|牛板金|开店宝pos机|信用长丰|同学加油|极速现金侠|家多宝|三信理财|指尖租赁|金融无忧|蓄金所|增信宝|k投|恩多在线|钱花花|360快借宝|借点钱|长安新生|小驴金融|乌托邦财富|芝麻钱站|添添汽车管家|快金|务工宝|中投融|泊桥|财富500|好收益|信用付|信用金|迅信创投|和商盟|惠信宝|景泰车行|众得宝|马上借|找钱花|招 墒|万盈金融|九金所理财|车财网|51信用卡管家|恒大犀望|税融通|浪花黑卡|美易房|信用体检|莞车车|嬍笠貨|小钱小乐|36O徣条|借了没|现金卡|闪垫钱急送|零零花|车国商户版|融钱宝|向上有财|易搜小意思|国美易卡|惠借资讯|赚赚|给你花大学版|合金融|爱钱进|良薪宝|钱一百|爱任信|借更多攻略|征信秘书|提前乐|消金|夸客优富|媺苙柋|找钱|信用助手|积分当钱花|海银会|朋友范|微零花|创富ist手机交易平台|马上销售|贵尊融资|and金融|闪借|大黄蜂信用|月光足|信用宝|pp理财hd版|随意借|铸金所|正好花|豆芽金融|大众金融|闪信快借|融交所|盛钱包|南瓜马车善理|徣贝|青春花|招财有道|鰴柆柋|贝才|千百亿|凡普金科|帮你还大学生版|金蚂蚁|前海荣格金融|民生助粒|享购生活|富优网|急用钱|小赢钱包|365橙融网|摇钱花|美团金融服务|现货达人|农 E 借|给你花|百度有钱|京金联|华赢宝|马上消费|优学宝|优亿金融|月光宝盒|相融网|搜易达|泰山金融|在线金融超市|搜益|生菜金融|汽车金融|无锡车缘|狮桥集团|钱急送|拉卡拉|智汇魔方|小凡|龙腾社区|诺诺镑客理财|快易花|小黑鱼|借吧超市|丹东市公积金|青蚨在线|找钱猫|提额无忧|度小满|凡驰金融|花小二|第一路演ipad版|微粒指南|车融道|佰财邦|好享借|速批款|久融理财|钱速来|取点|开心袋鼠|小赢成单|中邮钱包|山桃街|瑞福德金融|苏宁金融|卡牛信用卡管家|亚联财|徴粒货|金融助手100|闪电白领|惠借宝|龙驹财行|瑞鼎创投|美借|合拍在线|微易融|智富360|口袋和包|度D小满|北银消费|中兴财富|信用钱包|八戒宝|进货袋|数科|乐用宝|富宝袋|正海金融|刷脸|豆豆钱|麻利借|下钱快|随借宝|亿数据|国融消费|小米随星借|畅行花|省呗app|徴泣貨|中信顺手付|闪银信用|信用好管家|布丁信用|左手口袋|赚啦理财|信用卡提额大师|现金攻略|还 呗|憨分数据|桔子信用|还还|普惠|众金在线|科融宝|苏宁消金|e代付|花 坝|安吉租赁|宜聚网|q理财|拍拍|花 钡|征信司|芝麻分|快闪现金|智慧估价|大金所|从银保车险|九斗鱼|胖胖猪|易佰分|万卡|精锐助学|51小额速借|小牛在线|投友圈苹果版|满足花|趣还钱|有钱花|牛呗|微齐金融|国美金融|海金社|缺钱花|国融小额融|大扩商城|花  呗|筹组网|芝麻信用宝|人人科技|青创云汇|玖秘|私库|联金所|诚业网|徽粒货|干包|360融|全民财富理财|买买提乐购|房利网|长江e理财|钱相随|先花一亿元|爱钱进攻略|从容圈|黄金谷|19理财街|快立借|安心理财汇|周转无忧|喜迎财|清道夫债管家|钱借你|闪电猫|水来|国诚金融|摸神灯|零零购|京东小金库|天祺资本|零花钱|差钱吗|随便花|钱到到|趣提钱|助学乐|包银消费|钱钻|聚财村|小白优卡|随你借|安车汇|展客|爱又米|压岁钱包|金润二当家|凤凰智信|搜易借|农 行|还款分呗|e百福商家|㣲粒货|徽柆柋|钱急送快审版|汇通信诚租赁|京意借|中原消费|融360|金融博士|借现金|提钱购|玖富叮当|自由财富|荣通宝|融管家|固金所|小雨滴理财|洋钱罐|信用快借|徴笠貨|小花钱包|沪商财富|游侠网|徵柆貨|点融工坊|度小满有钱花|.*?借钱.*?|花 贝|趣代购|钱爸爸|信分宝苹果版|平安口袋银行客户端|借乐花|京东金融|米仓财行|快借专家|学乐派|有钱用|.*?分期.*?|放款啦|嬍柆货|友借|人人助学|融金所|☼借☼呗☼|众信金融|微众银行|云联掌柜|提款宝|橙子钱夹|小时借|荷包助手|微借|周转管家|中诚消费|我信100|华融钱袋|川佰网联|信e家|闪 银|钱到位|中腾信|鼎利网|钱伴|车前程|杭银商户|通通理财|缺钱么|苏 宁|纯白户口子|微 立 货|微信秒借|金山金融|卡贝贝|嬍柆柋|微立貣|穆金所|.*?贷.*?|徽立货|民信me金融|烧拼|晨星成长计划|小象优品|优优宝|长城滨银|360|借の呗|领钱|找我融|助学宝|速秒借|抵押品公示网|微博钱包|车易优门店版|花财|有钱花 |海通车融宝|花鸭|悠米闪借|汇联金融汇生活|徣 梖|爱钱进借啊|51钱宝|中赢急借通|现金白卡|蟹蟹|卡友联盟|随你花|飞行卡|借得到|美图e钱包|雏鹰助飞计划|小树理财|天星金融|异享金融|支点金融|多赢金融|零用金|爱零花|万家金融|花 呗|优啦金融|u资|秒放款|微钱进|皖都金融|金合社|财蜜|财加网|淘金汇|融族俱乐部|三文钱|能借|泛房金|橙保|供房帮|亚太投资|大马花|钱到家|小车宝|钱鱼借|融金宝|小周到口袋|沃钱包|西湖公证|惠域U卡|花吧|点点|借你花花|优车融|91好借|豆蔓理财|分美工薪版|微金所|小鸥bank|现金袋|樱桃信用|巨方助手|华众助学乐|周转宝|豹子融|51零用钱|度小満|友信宝|银联融投|花贝攻略|公积金e网通|三农资本理财|安家派|快鸽按揭|一点通财富|现金速递|木头人|芝麻信用|网利宝|海通恒信|随心花|胶囊|人人u学|好店商家版|佑米|安富金融|糯米袋|央金所|趣钱花|汇中网|零用钱|北现金融|黄河金融|乐花卡|信用盒子|摇钱|借趣花|闪电办卡|富中富|助力钱包|盎盎理财|菜牛钱袋|好借好还|钱保姆理财|秒分商城|爱钱帮|提钱乐|芝麻资讯|房金所|么么管家|智联笑花|马上购|小卡信用卡|多享借点|赶钱网|借借湾|移动支付|唯麦会|楼金所|奇瑞金融|宁创信誉卡|提额助手|招联金融|开单王|融八牛|钱而已|来借苹果版|懒腰|玖融网手机版|金信宝|借了吧|瑞风聚财|淘当铺联盟|好融|361汇金|莫愁花|普金吉理财|抱财网|普汇云通|借乎|垫付宝|用钱网|黄金屋|车果|去哪借|融金所理财|小葱零花|淘钱宝|郑投网理财|雷诺金融神器|推荐通|享发金融|你我借|小安时代|豆豆钱闪电版|壹点聚财|极钱花|信融花花|小树时代|建行房e通|百万钱包|珠江直销银行|钱包|借吧|借点钱专业版|圆圆来了|e袋购|翼支付随意借|读秒|江湖救急|陆金服|小花在线|极融|有贝钱袋|快乐达|隆金宝|.*?金服.*?|顺丰金融|阿里金融|徵莉貨|小荷网|期货原油宝|闪电王|浙风金融|帮你还|米理财|小好用钱客户版|借点点|51人品|你我花|中国移动随心花|极融平台|真好借|活力花|如愿创投|借客|连诚商户版|一汽租赁|送你花|中邮消费|乐享借|短融宝|生钱袋|轻松徣|银湖网|平安安金袋|量子金融|借的快|米牛|好会借|零用金iphone版|黑白好借|悦享花|银资|58按揭|雪中金融|上汽财务|债券宝|新浪金融|钱夹谷谷|借了吗专业版|花卡宝藏版|用卡指南|爱银网|泰金所|闪银闪电版|糯糯微整|身价网|qdd钱大大|到期还款|查信用分|浦发倍富金|北方金融网|现金站|91好借极速版|好友帮筹|微量买单|vivo钱包|矀柆袋|魔法现金|连连赚|青金所|指尖钱庄|先锋易融|工银融e借|现金快递|友钱任信|小额速借|盈盈有钱|万达网络金融|永辉金融|值得借|享借|千百块福利版|小云金融|亿融一品立方|.*?普惠|火箭理财|e租宝|嬍柆垈|好借啊|洋钱袋|汇民货款|川惠财富|量化派|老母鸡|花贝|华企金融|精真估商家版|狮桥|卡卡信用管理|平安小消|和合速融|来钱口子|融资易|天盛财富|花薪|斑马王国|花无缺|格米|唯品金融|投哪网理财|银钱铺子|环宇金融|急借通|金融工场|百度有钱花|信用花|钱莫愁|矀柆玳|500理财|长安金融|考拉征信|融呗|绿地广财|盈家生活|借易得|荷包提额|水象借点花|借客ios版|荣信汇|惠恩资本|今借到|国众宝|微米信任付|债掌柜|安心签|蜜蜂金融|京东金条|人人爱|携程金融|海金所|乐宝袋|米管家|宝马金融|58金融|u信|开花啦|美易分|惠花|钱站|金融铺子|支 咐 宝|羊小咩|有用无忧|甜橙财富|债无忧|天易保车主版|生财宝宝|顺借|借备|小嘟供车|美易车|有钱宝|容易借|弹个车|钱有道|招联零零花|鑫天下财富|天下信用|石投金融|借财童子|月光侠|嶶苙貨|仟金所|水滴信用|易借|征信宝|花啦花啦|闪还|联合汇商|融儿|带信金融家|极速熊|小钱|任性花|小市民快借|小葱快速借|福特金融|房融界|.*?花呗.*?|淘当铺|㣲粒貸|钱小乐|易巴巴|唐貸金融超市|惠众金融|聚融圈|卡来卡往|网信千金|给你花pro|钱脉堡理财|徣 贝|有好单|抢先花|51闪电卡|嗨付|课栈|开花啦苹果版|.*?借条.*?|钞市|速借巴士|徽立貸|帮信|百家借|给你花极速版|云城客|御财金融|新华现货|度小满金融|预支卡|借 呗|人人投|36氪创投助手|差钱指南|橙易借|融易花|平安陆金所|淘金荟|嘉车有约|嗨钱|卡农社区|清搜宝|青蜂融商|马上有钱|放心借|微粒达人|加上助学|利信快捷金融|松鼠金融|小狐惠花|品而金融|e好融|.*?还呗.*?|大地零花钱|奇享|现金口袋|金二代|壹钱包|汇中大金融|榕树|五叶金融|铸道e网|趣借吧|友时代|乐易购|七八金融|润业金融|花 ¤贝|争时金融|好人好信|汇贾商城|易鑫集团|国美美借|九州好融通|快来钱|支 付 宝|雷克萨斯金融|链链金融|马上金融|e兴金融|中融信达|鑫钱袋|征信管家|豆豆钱袋|手机和包|礼德财富|人人花|用钱|宏信金融|悦纷享|增信司|钱秒付|钱吧金融|u小钱|大同行|当天放款|钱上钱|短借宝|评估神|魔借|银客网|玖富家多宝|积金汇|如意借|秒借|平安租赁|益家理财|借花花|小额借宝|好借好还资讯|58好借|霹雳pay|钱吧汽车|必要花|袋富宝|恒易融|招 联|简借|资本在线|人人积金|金手付|源金所|周转头条|浦发万用金|速借宝|快递金|百度金融|分付君|融财易|.*?白条.*?|维信金科|蚂蚁e车|徵砬货|不差钱|期待乐|钱钱+|快钱|嘉数|佰仟金融|我要卡|卡卡银行苹果版|南商所邮币卡|卡农金融一体机|现金博士|嬍垃柋|借了没攻略|摇钱树|银联掌柜|芝麻好信|鸿诚担保|芝麻提额|.*?消费金融.*?|美团生活费|零零期iphone版|徣 唄|首付游|e债天下|一塔湖图金融超市|中智信|融这里|财鸟抢单|闪银|趣店|银豆理财|闪银奇异|校开花|广汽汇理|快借|合时代金融|美分派|借去花|壹有钱|橙应用|拉比鸟|小鹅花钱|丰投网|普咚花|嶶砬貨|借了吗|欢太金融|保航聚财|e百福客户端|易美健|银钱包|徽融通|佳缘金融|51旺财|橘花|风控宝|月季花|神灯金融|来借|不借|利聚网|收获宝|随便借|融时代管家|爱投资|二师兄|随手借|融资易手机|米粉钱包|老虎钱袋|天龙金融|信通袋|KOO钱包|熟帮|可信金融|每利网|平安保|阿里金手|汇浦|易学期|52校园|阿里有钱花|满帮金融|美信生活|元宝铺|芝麻小金|1号投|点石金融|上汽通用金融|果树财富|提钱游|红岭创投|城市圈|钱吧|钱有路|猫头鹰rm|火速用钱宝|通盛消费|借得快|周转灵|.*?借款.*?|薪乐宝|宏鑫宝";

    public static final String loanLineRegex =
            "(?<=额度.{1,5}|成功提额|已获取|预审批额度已于今日由|可借款.资格.{1,2}|预审批额度由|可借金额已提升为)(\\d+\\.?\\d+)";

    public static final String itntLoanRepayRegex =
            "还款金额为|账单待还|偿还账单提醒|账单金额|好借账单|应还|还款额为|账单还款日|应扣金额|本期还款额|本期账单|应.*?还款|将从余自动还|需还|还款提醒|已临近还款日期|及时还款|待还|将.*?扣|本月还款日|将.*?还款|还款日.*?还剩|还款日.*?今天|是您还款日|月账单为|本次账单还款日|借款还款日|车贷月供|借款明日到期|借款将于.*?到期|将到账单日|剩.*?未还|月账单|明天为还款到期日|账单未还清|有.*?元欠条|今日已到还款日|预计.*?扣款|需于.*?还款|本期拿去花账单|是您最后还款日|还款日已到期|账单现已到期|借款今日到期|借款于.*?到期|借款明天到期|借款已到期";

    public static final String itntLoanRepayAmtRegex = "(\\d+\\.?\\d+)(?=元)";
    public static final String odkwRegex =
            "已.{0,4}逾期|已.{0,4}违约|处理.*?欠款|欠款.*?处理|归还.*?欠款|已过.*?还款日|欠款多次通知仍不还|违反了合同约定|将您的贷款信息如实报送至|欠款一事|将被纳入第一代央行征信黑名单|逾期\\d+天|恶意逾期|还清欠款|拒不履行|失信人惩戒措施|无还清逾期|账单经多次联系您仍未处理|严重逾期|无还款意愿|已超期|还款超期|欠款逾期|逾期账单即将进入执行阶段|到期账单还没还清|逾期账单已由|逾期欠款|花呗分期逾期|合同纠纷|欠款严重超期|超过约定.*?日|逾期不履行还款义务|违约未按合同进行还款|未扣到你的车贷月供款|逾期应付的罚息|多次催缴无果";

    public static final String loanRepayRemindRegex =
            "还款金额为|账单待还|偿还账单提醒|账单金额|好借账单|应还|还款额为|账单还款日|应扣金额|本期还款额|本期账单|应.*?还款|将从余自动还|需还|还款提醒|已临近还款日期|及时还款|待还|将.*?扣|本月还款日|将.*?还款|还款日.*?还剩|还款日.*?今天|是您还款日|月账单为|本次账单还款日|借款还款日|车贷月供|借款明日到期|借款将于.*?到期|将到账单日|剩.*?未还|月账单|明天为还款到期日|账单未还清|有.*?元欠条|今日已到还款日|预计.*?扣款|需于.*?还款|本期拿去花账单|是您最后还款日|还款日已到期|账单现已到期|借款今日到期|借款于.*?到期|借款明天到期|借款已到期";

    public static final String loanRepaySuccRegex =
            "还款成功|成功扣款|成功还款|从您尾号*的工商银行卡扣款|扣款成功|已成功结清|已自动扣款|本次还款.*?元|成功划扣|成功扣收|成功还完|已还款|已系统自动扣款|已成功通过<放心借>还款|成功自动还款|共完成*笔代扣|已经结清|已结清|本次还款.*?元|日还款.*?元|银行卡中扣除|账单已还|已提前还款|已收到您的还款|还款.*?元成功|于.*?还款.*?元|已还清|主动还款|已于.*?日扣款";

    public static final String loanRepayFailRegex =
            "还款.*?失败|划扣.*?失败|扣款.*?失败|代扣.*?失败|代扣未成功|还款未成功|未扣款成功|银行卡余额不足";

    public static final String loanApplySuccessRegex =
            "放款.*?成功|成功.*?放款|已.*?打款|已.*?放款|放款.*?已|提现申请已通过审核请|分期贷款.*?已成功支付|本次借款金额为|借款已提现到账|申请.*?已到|借款已审核通过|申请.*?已.{0,2}转入|借款已到|申请.*?已发放|用款申请已通过审核.*?到账|提款.*?已向.*?转账|贷款已经获准|申请.*?已获准|打白条|消费成功|申请.*?已到账|借款已审批|借款已发放|借款已审批通过|分期已审批通过|借款成功了|借款已.*?汇入|成功交易|已成功使用.*?额度支付|借款.*?已打款至|借款计划已收款成功|申请的.*?借款已通过|成功发放至|借款?\\d+元.?分\\d+期|提现人民币|消费人民币";

    //    public static final String bakRegex = "";

    public static String getBodyName(String input) {
        if (input != null) {
            String strip = StringUtils.strip(input, " ");
            return RegexTools.getRegexResStrInPos(strip, bodyNameRegex, 0);
        }
        return null;
    }

    public static int getTelecomFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, teleComRegex);
    }

    public static int getExpressFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, expressRegex);
    }

    public static int getServiceFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, serviceRegex);
    }

    public static int getPaytoolFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, payToolRegex);
    }

    public static int getBankFlag(String body_name, String body) {
        int body_name_res = RegexTools.hiveUdfRegExp(body_name, bankBodyNameRegex);
        int body_res = RegexTools.hiveUdfRegExp(body, bankBodyRegex);

        if (body_name_res == 1 && body_res == 0) {
            return 1;
        } else {
            return 0;
        }
    }

    public static int getCreditCardFlag(String body_name, String body) {
        int body_name_res = RegexTools.hiveUdfRegExp(body_name, creditBodyNameRegex);
        int body_name_res2 = RegexTools.hiveUdfRegExp(body_name, creditBodyNameRegex2);
        int body_res = RegexTools.hiveUdfRegExp(body, creditBodyRegex);

        if (body_name_res == 1 || (body_name_res2 == 1 && body_res == 1)) {
            return 1;
        } else {
            return 0;
        }
    }

    public static int getcashOutFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, cashOutRegex);
    }

    public static int getcashInFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, cashInRegex);
    }

    public static int getloanRepayFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, loanRepayRegex);
    }

    public static BigDecimal getBankRemainAmt(String input) {
        String res = RegexTools.getRegexResStrInPos(input, bankRemainAmtRegex, 1);
        if (res != null && Double.valueOf(res) <= DECIMAL102LIMIT) {
            return formatDecimalVal(res);
        }
        return null;
    }

    public static BigDecimal getCashOutAmt(String input) {
        String res = RegexTools.getRegexResStrInPos(input, cashOutAmtRegex, 1);
        if (res != null && Double.valueOf(res) <= DECIMAL102LIMIT) {
            return formatDecimalVal(res);
        }
        return null;
    }

    public static BigDecimal getCashInAmt(String input) {
        String res = RegexTools.getRegexResStrInPos(input, cashInAmtRegex, 1);
        if (res != null && Double.valueOf(res) <= DECIMAL102LIMIT) {
            return formatDecimalVal(res);
        }
        return null;
    }

    public static BigDecimal getCrdtAmt(String input) {
        String res = RegexTools.getRegexResStrInPos(input, crdtAmtRegex, 1);
        if (res != null && Double.valueOf(res) <= DECIMAL102LIMIT) {
            return formatDecimalVal(res);
        }
        return null;
    }

    public static BigDecimal getCrdtCosuAmt(String input) {
        String res = RegexTools.getRegexResStrInPos(input, crdtCosuRegex, 1);
        if (res != null && Double.valueOf(res) <= DECIMAL102LIMIT) {
            return formatDecimalVal(res);
            //            return new BigDecimal(res);
        }
        return null;
    }

    private static BigDecimal formatDecimalVal(String input) {
        BigDecimal bigDecimal = new BigDecimal(input).setScale(2, BigDecimal.ROUND_HALF_UP);
        DecimalFormat decimalFormat = new DecimalFormat("#.##");
        String format = decimalFormat.format(bigDecimal);

        return new BigDecimal(format);
    }

    public static Object[] calcMinMaxAvgStd(ArrayList<BigDecimal> list) {
        Object[] res = null;
        int listSize = list.size();
        if (listSize > 0) {
            res = new Object[4];
            if (listSize == 1) {
                res[0] = list.get(0);
                res[1] = list.get(0);
                ;
                res[2] = list.get(0);
                ;
                res[3] = new BigDecimal(0);
            } else {
                Collections.sort(list);
                BigDecimal minAmt = list.get(0);
                BigDecimal maxAmt = list.get(listSize - 1);
                BigDecimal sumAmt = new BigDecimal(0);
                for (int i = 0; i < listSize; i++) {
                    sumAmt = sumAmt.add(list.get(i));
                }

                HiveDecimal hiveDecimalSumAmt = HiveDecimal.create(sumAmt);
                HiveDecimal hiveDecimalAvgAmt =
                        hiveDecimalSumAmt.divide(HiveDecimal.create(listSize));

                //                System.out.println("scale: " +
                // hiveDecimalAvgAmt.bigDecimalValue().scale());

                //                BigDecimal divide = HiveBigDecimal.divide(sumAmt, new
                // BigDecimal(listSize));
                //                System.out.println("new res: " + divide);

                //                System.out.println("new res: " + sumAmt.divide(new
                // BigDecimal(listSize), 4, RoundingMode.HALF_UP));

                //                System.out.println("hiveDecimalAvgAmt:" + divide );

                Double aDouble = hiveUdfStddevPopBigDecimal(list);

                res[0] = minAmt;
                res[1] = maxAmt;
                res[2] = hiveDecimalAvgAmt.bigDecimalValue();
                res[3] = aDouble;
            }
        }
        return res;
    }

    private static Double hiveUdfStddevPopBigDecimal(ArrayList<BigDecimal> list) {
        int size = list.size();
        int count = 0;
        double variance = 0.0;
        double sum = 0.0;
        for (int i = 0; i < size; i++) {
            count++;
            double v = list.get(i).doubleValue();
            sum += v;
            if (count > 1) {
                double t = count * v - sum;
                variance += (t * t) / ((double) count * (count - 1));
            }
        }
        variance = variance / size;
        variance = Math.sqrt(variance);
        return variance;
    }

    public static int getItntLendFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, itntLendBodyNameRegex);
    }

    public static BigDecimal getLoanLineAmt(String input) {
        String res = RegexTools.getRegexResStrInPos(input, loanLineRegex, 1);
        if (res != null && Double.valueOf(res) <= DECIMAL102LIMIT) {
            return formatDecimalVal(res);
        }
        return null;
    }

    public static BigDecimal getLoanRepayAmt(String input) {
        if (RegexTools.hiveUdfRegExp(input, itntLoanRepayRegex) == 1) {
            String res = RegexTools.getRegexResStrInPos(input, itntLoanRepayAmtRegex, 1);
            if (res != null && Double.valueOf(res) <= DECIMAL102LIMIT) {
                return formatDecimalVal(res);
            }
        }
        return null;
    }

    public static int getOdKwFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, odkwRegex);
    }

    public static int getLoanRepayRemindFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, loanRepayRemindRegex);
    }

    public static int getLoanRepaySuccessFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, loanRepaySuccRegex);
    }

    public static int getLoanRepayFailFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, loanRepayFailRegex);
    }

    public static int getLoanApplySuccessFlag(String input) {
        return RegexTools.hiveUdfRegExp(input, loanApplySuccessRegex);
    }

    public static int isDayTime(Long time) {
        int hourOfTime = CommonTimeTools.getHourOfTime(time);

        if (hourOfTime >= 8 && hourOfTime <= 22) {
            return 1;
        }
        return 0;
    }

    public static int isWeekend(Long time) {
        int dayOfWeek = CommonTimeTools.getDayOfWeek(time);
        if (dayOfWeek == 1 || dayOfWeek == 7) {
            return 1;
        } else {
            return 0;
        }
    }

    /** 适配模型线下错误逻辑 */
    public static int isWeekend2(Long time) {
        int dayOfWeek = CommonTimeTools.getDayOfWeek(time);
        if (dayOfWeek == 7) {
            return 1;
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        ArrayList<BigDecimal> input = new ArrayList<>();
        input.add(new BigDecimal("1.86"));
        input.add(new BigDecimal("11.86"));
        input.add(new BigDecimal("76.57"));
        input.add(new BigDecimal("47.57"));
        input.add(new BigDecimal("105.57"));
        input.add(new BigDecimal("5.57"));
        input.add(new BigDecimal("105.91"));
        input.add(new BigDecimal("0.91"));
        input.add(new BigDecimal("42.91"));
        input.add(new BigDecimal("74.91"));
        input.add(new BigDecimal("86.91"));
        input.add(new BigDecimal("1.91"));
        input.add(new BigDecimal("81.91"));
        input.add(new BigDecimal("7.82"));
        input.add(new BigDecimal("107.82"));
        input.add(new BigDecimal("2.82"));
        input.add(new BigDecimal("27.82"));
        input.add(new BigDecimal("299.82"));
        input.add(new BigDecimal("199.82"));
        input.add(new BigDecimal("300.22"));
        input.add(new BigDecimal("0.64"));
        input.add(new BigDecimal("27.64"));
        input.add(new BigDecimal("3.34"));
        input.add(new BigDecimal("120.18"));
        input.add(new BigDecimal("2.38"));
        input.add(new BigDecimal("29.79"));
        input.add(new BigDecimal("134.79"));

        Object[] bigDecimals = calcMinMaxAvgStd(input);
        System.out.println("min: " + bigDecimals[0]);
        System.out.println("max: " + bigDecimals[1]);
        System.out.println("avg: " + bigDecimals[2]);
        System.out.println("std: " + bigDecimals[3]);

        Double aDouble = hiveUdfStddevPopBigDecimal(input);

        System.out.println("double std: " + aDouble);

        System.out.println("decimal: " + new DecimalFormat("#.##").format(2.295149));

        System.out.println("api decimal: " + formatDecimalVal("2.295149"));
        System.out.println("api decimal: " + formatDecimalVal("51"));
    }
}
